#pragma once
_Pragma("once")

// #include <iostream>
// #include <tuple>
// #include <utility>
// #include <cmath>
// #include <algorithm>


//win64下用double型，arm32用float
#ifdef _win64系统
typedef double floatx;
#else 
typedef float floatx;
#endif


typedef struct 
{
    float kp;
    float ki;

    float upper;//限幅
    float lower;//限幅

    float y_init;//输出的初始值

    //float Ts;//采样时间

    float yi; //积分值
    float y;//输出信号

} PI_Struct;

/* typedef struct 
{
    double k; //增益
    double k0;//直流抑制增益

    double X1;//正交信号输出
    double X2;//正交信号输出
    double X0;//直流抑制信号

} SOGI; */

typedef struct 
{
    floatx k; //增益
    //floatx k0;//直流抑制增益

    floatx err;//输入误差信号
    floatx X1;//正交信号输出
    floatx X2;//正交信号输出
    //floatx X0;//直流抑制信号

} SOGI_DCnoRejection;

typedef struct {        
        floatx f;//频率
        floatx w;//角频率
        floatx dw;//Δw
        float gama;//系数
        float Amin;//同幅值相关的自动增益系数，最小值
        float dwmax;//角频率限幅
        float dwmin;//角频率限幅
} FLL_Struct;//fll计算

typedef struct 
{
    struct {
        floatx θ;//相位
        floatx f;//频率
        floatx A;//幅值
        float f_lower;//低通滤波器频率 
        float PI_autoGain_min;//PI自动自动增益系数最小值   
        PI_Struct    sPI1;//PI调节器
        
    } PLL;//pll计算

    FLL_Struct sfll;
 
    struct {
        floatx α;
        floatx β;
        floatx A;        
    } 正序;

    struct {
        floatx α;
        floatx β;              
    } 负序;

    floatx A_αβ; //通过αβ算出的幅值

    struct {
        floatx q_err;//滤波后q轴量
    }中间量;
    
    SOGI_DCnoRejection  sSOGIa;//正交信号输出   
    SOGI_DCnoRejection  sSOGIb;//正交信号输出

} DSOGI_PNSC_FLL_PLL;




// Function declaration
#ifdef __cplusplus
extern "C" {
#endif

extern DSOGI_PNSC_FLL_PLL* DSOGI_PNSC_FLL_PLL_Creat();

extern void DSOGI_PNSC_FLL_PLL_Cal(
    DSOGI_PNSC_FLL_PLL *p,
    float alpha, float beta, float f0,
    float Ts,
    float A_min4autogain, float dw_max, float dw_min,
    float SOGI_k, float fll_gama,
    float f_lower, float PI_kp, float PI_ki,
    float *wt_pll, float *A_pll, float *f_pll,
    float *f_fll,
    float *A_alpha_beta, float *A_pos,
    float *PosSeqAlpha, float *PosSeqBeta,
    float *NegSeqAlpha, float *NegSeqBeta,
    int reset);

#ifdef __cplusplus
}
#endif




